package cho114366.basic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

//컨트롤 쉬프트 +O ==> 자동으로 import 추가 

/*import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;*/

//import java.sql.*; // 와일드로 같은 패키지 클래스 호출 // 가독성 측면에선 안좋다

// 서비스 임플리먼드 안에 jdbc 관련 영어의 동사 같은 내용을 상세히 담는다. 이 곳에메서드는 인터페이스 클래스의 메소드를 구현한다. 메인 클래스에서 인터페이스 메서드를 가져다 쓴다.
// 나중에 같은 내용은 클래스 및 메서드에 담아 쓴다. 
public class J20_BookDBDAO implements J20_BookDBService {

	// JDBC
	// 접속정보--------------------------------------------------------------------------------------

	private static final String DRV = "oracle.jdbc.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@//localhost:1521/xe";
	private static final String USR = "scott";
	private static final String PWD = "TIGER";

	// SQL문
	// 정의--------------------------------------------------------------------------------------------

	private static final String insertSQL = " insert into BOOKDB(title,publisher,author)values(BOOKDB.nextval,?,?,?) ";
	// 오라클 확인// 그대로//가져와라
	private static final String selectSQL = " select BOOKid, title from BOOKDB order by BOOKid desc ";
	private static final String select1SQL = " select * from BOOKDB where BOOKid=? ";
	private static final String updateSQL = " update BOOKDB set title=?, publisher=?, author=?, regdate=sysdate where BOOKid=? ";
	private static final String deleteSQL = " delete from BOOKDB where BOOKid=? ";

	@Override
	// boolean 대신 결과만 넘기기 위해 데이터타입 선언
	public int insertBookDB(J20_BookDBVO b) {
		Connection conn = null; // 연결
		PreparedStatement ps = null; // 문장 넘기는 메서드호출
		int cnt = 0; // 카운트 변수 초기화
		try {
			Class.forName(DRV);// 데이터베이스 드라이버 로드
			conn = DriverManager.getConnection(URL, USR, PWD); // 접속 정보
			ps = conn.prepareStatement(insertSQL); // 문장 넘기기

			// ? 부분에 들어갈 필드값 호출 bookdbVO 에서 변수를 가져온다
			ps.setString(1, b.getTitle());
			ps.setString(2, b.getPublisher());
			ps.setString(3, b.getAuthor());
			ps.setString(4, b.getId());
			cnt = ps.executeUpdate(); // 문장 실행 카운트 담기

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 변수들을 반납하는 구문
			if (ps != null)
				try {
					ps.close();
				} catch (Exception e) {
				}
			if (conn != null)
				try {
					ps.close();
				} catch (Exception e) {
				}
		}
		return cnt;
	}

	@Override
	public String selectBookDB() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null; // 추가됨!@@ 검색값을 받기 위해...
		StringBuilder result = new StringBuilder();
		// attaylist로 변경예정
		try {
			// 예외처리 try 구문 진행이 안되는 상황 // 좀비 상태가 되기에 메모리를 잡고 있어 메모리부족현상을 유발할 수
			// 있다.
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(selectSQL);
			ps.executeQuery(); // 업데이트가 아닌 쿼리를 쓴다.......

			// select sql 실행 후 결과 처리
			while (rs.next()) {
				// 가져올 검색결과 필드값 몇개인지를 알고 작성한다.
				for (int i = 1; i <= 2; ++i)
					result.append(rs.getString(i)).append(" ");
					result.append("\n");
			}
		} catch (Exception ex) {

		} finally {
			if (rs != null)
				try {
					rs.close();
				} catch (Exception e) {
				}
			if (ps != null)
				try {
					ps.close();
				} catch (Exception e) {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				}
		}
		return result.toString();
	}

	@Override
	public String selectBookDBbyTitle(String id) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String result = "";
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(select1SQL);
			rs = ps.executeQuery();

			while (rs.next()) {
				for (int i = 1; i <= 5; ++i)
					// 가져올 필드 값이 5개라 5개의 내용을 가져온다.
					result += rs.getString(i) + "";
				result += " ";
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (ps != null)
				try {
					ps.close();
				} catch (Exception e) {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				}
		}
		return result;

	}

	@Override
	public int updateBookdb(J20_BookDBVO b) {
		Connection conn = null;
		PreparedStatement ps = null;
		int cnt = 0;
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(updateSQL);

			ps.setString(1, b.getTitle());
			ps.setString(2, b.getPublisher());
			ps.setString(3, b.getAuthor());
			ps.setString(4, b.getId());

			cnt = ps.executeUpdate();
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (ps != null)
				try {
					ps.close();
				} catch (Exception e) {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				}
		}
		return cnt;
	}

	@Override
	public int deleteBookDB(String id) {
		Connection conn = null;
		PreparedStatement ps = null;
		int cnt = 0;
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			ps = conn.prepareStatement(deleteSQL);
			ps.setString(1, id);
			cnt = ps.executeUpdate();
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (ps != null)
				try {
					ps.close();
				} catch (Exception e) {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				}
		}

		return cnt;
	}

}
